package com.tinem.platform.web.auth.login.oauth2.ad;

import com.baidu.fsg.uid.UidGenerator;
import com.tinem.platform.module.pojo.enums.rbac.GenderEnum;
import com.tinem.platform.module.starter.jpa.entity.oauth.Oauth2AzureAdUserInfo;
import com.tinem.platform.module.starter.jpa.repository.oauth2.Oauth2AzureAdUserInfoRepository;
import com.tinem.platform.web.auth.login.oauth2.Oauth2Server;
import com.tinem.platform.web.auth.page.LoginUserInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;

/**
 * @author fzh
 * @version v1
 * @program: platform
 * @className AzureADOauth2Server
 * @description TODO
 * @site 
 * @company 
 * @create 2020-09-01 13:59
 */
@Service("oauth2Server-azure")
public class AzureADOauth2Server implements Oauth2Server {

    @Autowired
    private UidGenerator uidGenerator;

    @Resource
    Oauth2AzureAdUserInfoRepository oauth2AzureAdUserInfoRepository;


    @Override
    public String getOpenId(OAuth2User oAuth2User) {
        return (String) oAuth2User.getAttributes().get("oid");
    }

    @Override
    public String getName(OAuth2User oAuth2User) {
        return (String) oAuth2User.getAttributes().get("name");
    }

    @Override
    public String getNickName(OAuth2User oAuth2User) {
        return (String) oAuth2User.getAttributes().get("name");
    }

    @Override
    public String getEmail(OAuth2User oAuth2User) {
        return (String) oAuth2User.getAttributes().get("unique_name");
    }

    @Override
    public String getCountryMobileCode(OAuth2User oAuth2User) {
        return null;
    }

    @Override
    public String getMobile(OAuth2User oAuth2User) {
        return null;
    }

    @Override
    public String getHeadImage(OAuth2User oAuth2User) {
        return null;
    }

    @Override
    public GenderEnum getSex(OAuth2User oAuth2User) {
        return GenderEnum.SECRECY;
    }

    @Override
    public Date getExpired(OAuth2User oAuth2User) {
        return Oauth2Server.EXPIRED;
    }

    @Override
    public Date getLockedDate(OAuth2User oAuth2User) {
        return new Date();
    }


    @Override
    public boolean getEnabled(OAuth2User oAuth2User) {
        return true;
    }

    @Override
    public String findUserByOpenId(String openId) {
        Oauth2AzureAdUserInfo oauth2AzureAdUserInfo = oauth2AzureAdUserInfoRepository.findFirstByOid(openId);
        if(oauth2AzureAdUserInfo == null){
            return null;
        }
        return oauth2AzureAdUserInfo.getUserId();
    }

    @Override
    public void saveInfo(LoginUserInfo loginUserInfo) {
        Oauth2AzureAdUserInfo oauth2AzureAdUserInfo = new Oauth2AzureAdUserInfo();
        oauth2AzureAdUserInfo.setId(uidGenerator.getUID());
        oauth2AzureAdUserInfo.setUserId(loginUserInfo.getUserId());
        oauth2AzureAdUserInfo.setAio((String) loginUserInfo.getOAuth2User().getAttributes().get("aio"));
        oauth2AzureAdUserInfo.setAmr((String) loginUserInfo.getOAuth2User().getAttributes().get("amr"));
        oauth2AzureAdUserInfo.setFamilyName((String) loginUserInfo.getOAuth2User().getAttributes().get("family_name"));
        oauth2AzureAdUserInfo.setGivenName((String) loginUserInfo.getOAuth2User().getAttributes().get("given_name"));
        oauth2AzureAdUserInfo.setIpaddr((String) loginUserInfo.getOAuth2User().getAttributes().get("ipaddr"));
        oauth2AzureAdUserInfo.setName((String) loginUserInfo.getOAuth2User().getAttributes().get("name"));
        oauth2AzureAdUserInfo.setOid((String) loginUserInfo.getOAuth2User().getAttributes().get("oid"));
        oauth2AzureAdUserInfo.setSub((String) loginUserInfo.getOAuth2User().getAttributes().get("sub"));
        oauth2AzureAdUserInfo.setTid((String) loginUserInfo.getOAuth2User().getAttributes().get("tid"));
        oauth2AzureAdUserInfo.setUniqueName((String) loginUserInfo.getOAuth2User().getAttributes().get("unique_name"));
        oauth2AzureAdUserInfo.setUpn((String) loginUserInfo.getOAuth2User().getAttributes().get("upn"));
        oauth2AzureAdUserInfo.setUti((String) loginUserInfo.getOAuth2User().getAttributes().get("uti"));
        oauth2AzureAdUserInfo.setVer((String) loginUserInfo.getOAuth2User().getAttributes().get("ver"));
        oauth2AzureAdUserInfoRepository.saveAndFlush(oauth2AzureAdUserInfo);
    }

    @Override
    public Collection<BigInteger> getDefaultGroupIds() {
        return Arrays.asList(BigInteger.ONE);
    }

    @Override
    public Date getExpiredDate(OAuth2User oAuth2User) {
        return Oauth2Server.EXPIRED;
    }

    @Override
    public String getPassword(OAuth2User oAuth2User) {
        return null;
    }

    @Override
    public Date getPasswordExpired(OAuth2User oAuth2User) {
        return Oauth2Server.EXPIRED;
    }
}
